home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Atari Compendium
/
The Atari Compendium (Toad Computers) (1994).iso
/
files
/
umich
/
utils
/
tosfixes
/
hsmoda05.lzh
/
HSM_DOKU
/
SERSOFST.TXT
< prev
Wrap
Text File
|
1994-10-24
|
35KB
|
790 lines
Festlegung einer Softwareschnittstelle, die eine vollständig
hardwareunabhängige Nutzung serieller Interfaces ermöglicht
============================================================
Definition of a software interface, providing a fully hardware
independend use of serial interfaces
==============================================================
This file contains the english version too, begin to search at the
middle of the text.
Text von: Harun Scheutzow, Dresdener Straße 83, D-10179 Berlin
Internet-Email: Harun_Scheutzow@B.maus.de
letzte Änderung der Definition: 12.11.1993
letzte Änderung der Erklärungen: 24.10.1994
Es sollen möglichst alle Funktionen definiert werden, die ein
Terminalprogramm, ein Übertragungsprotokoll oder z.B. ein Faxprogramm
benötigt. Diese Funktionen sollen ein hardwareunabhängiges Interface für
Programme darstellen.
Dieser Vorschlag ist Eric Smith bekannt. Es ist (noch?) KEIN
offizieller Atari-Standard. Eric findet den Vorschlag gut (nur die
Callbacks hält er bezüglich Memory Protection für nicht so toll) und
meint: Es ist besser, einen inoffiziellen Standard zu haben, als gar
keinen. Originalton im englischen Teil.
MiNT oder TOS oder ein nachzuladender Treiber sollen möglichst viele der
hier beschriebenen Funktionen unterstützen, soweit es die Hardware zuläßt.
Es muß aber jede Soft damit rechnen, daß eine Funktion nicht existiert
(Rückmeldung EINVFN, -32). Verhindert dies die Arbeit der Soft, so muß der
Nutzer darüber informiert werden.
Dies hier ist ein Standardisierungsversuch für das Interface, daß
Nutzerprogramme vorfinden. Über die Interna der Treiberimplementation soll
nichts geschrieben werden. Bei allen Funktionen und Vorschlägen muß aber
daran gedacht werden, daß diese auch auf einem 68000 mit 8MHz bei 38400Bd
über den MFP (also ohne FIFO) realisierbar sind. Die steigende Leistung der
CPUs ist kein Argument, da die gewünschte Datentransferrate auch ständig
steigt.
Fopen, Fread, Fwrite, Fclose dürften als normale GEMDOS-Funktionen jedem
bekannt sein. Fcntl ist die im MiNT (und in HSMODEM) vorhandene GEMDOS-Funktion
$104, mit LONG Fcntl( WORD filehandle, LONG special, WORD subfunction). Fcntl
liefert meist eine 0 als OK-Meldung, oder sonst einen Fehlercode. Irgendwelche
abgefragten Werte werden üblicherweise nicht als Returncode von Fcntl
geliefert, sondern auf einer Speicherstelle, auf die special zeigt.
Die Reservierung einer Schnittstelle will ich über den Öffnungsmodus von Fopen
realisieren.
Hier ein Versuch der Dokumentation, was MiNT bereits bieten soll.
Allerdings sind in MiNT nicht alle Funktionen vorhanden oder funktionieren
nicht ganz, wie sie sollten.
Manche Zeilen sind C, manche Kommentar. Bei den angegebenen
Funktionsaufrufen handelt es sich wirklich um Musteraufrufe, und nicht etwa
um mißgestaltete Prototypen.
Ermittlung, wieviel Byte nichtblockierend übertragen werden können
------------------------------------------------------------------
#define FIONREAD (('F'<< 8) | 1)
#define FIONWRITE (('F'<< 8) | 2)
Fcntl( handle, &count, FIONREAD)
Fcntl( handle, &count, FIONWRITE)
In count wird als 32Bit-Wert die Anzahl der Byte hinterlassen, die beim
nächsten Fread/Fwrite mindestens gelesen/geschrieben werden können. Da aber
möglicherweise mehrere Programme auf einen Port schreiben könnten, sollte
man nur den Returnwert von Fread/Fwrite für voll nehmen.
Setzen und Rücksetzen von Break
-------------------------------
#define TIOCCBRK (('T'<< 8) | 20)
#define TIOCSBRK (('T'<< 8) | 21)
Fcntl( handle, dummy, TIOCSBRK); /* Break aktivieren */
Fcntl( handle, dummy, TIOCCBRK); /* Break löschen */
Setzen/Abfragen der Eingabegeschwindigkeit und Steuerung der DTR-Leitung
------------------------------------------------------------------------
#define TIOCIBAUD (('T'<< 8) | 18)
Fcntl( handle, &speed, TIOCIBAUD);
Setze die Eingabegeschwindigkeit der Schnittstelle. In speed steht ein
32Bit-Wert, der die gewünschte Geschwindigkeit unkodiert in Bit pro Sekunde
angibt. speed = 19200 würde auf 19200bps setzen. In speed wird die
Geschwindigkeit vor dem Aufruf von TIOCIBAUD zurückgegeben. Ist sie
unbekannt, wird -1 geliefert. Ist beim Aufruf speed = -1, so wird nur die
Geschwindigkeit erfragt. Ist speed = 0, so wird das DTR-Signal auf inaktiv
gebracht (gelöscht), ohne die Geschwindigkeit zu beeinflussen. Bei
geschwindigkeitssetzendem Aufruf wird DTR automatisch aktiviert.
Rückgabewert ist ERANGE wenn die Geschwindigkeit nicht einstellbar ist.
Dann wird als "Ausnahme" in speed die nächstniedrigere mögliche
Geschwindigkeit geliefert. Gibt es keine nächstniedrige, so wird die
kleinstmögliche zurückgegeben.
Setzen/Abfragen der Ausgabegeschwindigkeit und Steuerung der DTR-Leitung
------------------------------------------------------------------------
#define TIOCOBAUD (('T'<< 8) | 19) Fcntl( handle, &speed, TIOCOBAUD);
Setze die Ausgabegeschwindigkeit der Schnittstelle. Die
Funktionsbeschreibung ist identisch zu TIOCIBAUD. Unterstützt eine
Schnittstelle getrennte Ein- und Ausgabegeschwindigkeit nicht, so
beeinflußt jeder Aufruf beide Geschwindigkeiten.
Übertragungsprotokolleinstellungen erfragen
-------------------------------------------
#define TIOCGFLAGS (('T'<< 8) | 22)
Fcntl( handle, &flags, TIOCGFLAGS);
Liefert in flags einen 16Bit-Wert der eingestellten Parameter, die eine
ODER-Verknüpfung der folgenden Werte darstellen. Alle anderen Bit sind
reserviert. Bei TIOCGFLAGS sollte man sie ignorieren. Sinnvollerweise
erfragt man mit TIOCGFLAGS, modifiziert die bekannten Werte, und setzt dann
per TIOCSFLAGS.
/* Anzahl der Stoppbits */
#define TF_STOPBITS 0x0003
/* 0x0000 nicht erlaubt
ERWEITERUNGSVORSCHLAG: So wird der Synchronmode aktiviert. Die restlichen
Parameter erhalten im Synchronmode andere Bedeutungen. Diese sind später
noch festzulegen. */
#define TF_1STOP 0x0001 /* 1 Stoppbit */
#define TF_15STOP 0x0002 /* 1.5 Stoppbit */
#define TF_2STOP 0x0003 /* 2 Stoppbit */
/* Anzahl der Bits pro Zeichen */
#define TF_CHARBITS 0x000C
#define TF_8BIT 0x0 /* 8 Bit */
#define TF_7BIT 0x4
#define TF_6BIT 0x8
#define TF_5BIT 0xC /* 5 Bit */
/* Handshakemodi und Parität */
#define TF_FLAG 0xF000
#define T_TANDEM 0x1000 /* XON/XOFF (=^Q/^S) Flußkontrolle aktiv */
#define T_RTSCTS 0x2000 /* RTS/CTS Flußkontrolle aktiv */
#define T_EVENP 0x4000 /* even (gerade) Parität aktiv */
#define T_ODDP 0x8000 /* odd (ungerade) Parität aktiv */
/* even und odd schließen sich gegenseitig aus */
Übertragungsprotokolleinstellungen setzen
-----------------------------------------
#define TIOCSFLAGS (('T'<< 8) | 23)
Fcntl( handle, &flags, TIOCSFLAGS);
Setzt die Einstellungen, Beschreibung dieser bei TIOCGFLAGS. Rückgabewert
ist ERANGE bei illegaler oder nicht unterstützer Kombination in flags.
Hier endet die Dokumentattion der mir bekannten und verständlichen Funktionen in
MiNT. Es folgen die neuen Vorschläge.
Leeren der seriellen Puffer
---------------------------
#define TIOCFLUSH (('T'<< 8) | 8)
Fcntl( handle, special, TIOCFLUSH);
(ist doch im Mint "/* BUG: this should flush the input/output buffers */")
Auswählbar über den special-Parameter werden die seriellen Puffer
unterschiedlich geleert:
special Funktion
0
Der Sendepuffer soll komplett gesendet werden. Die Funktion kehrt
erst zurück, wenn der Puffer leer ist (return E_OK, =0) oder ein
systeminterner Timeout abgelaufen ist (return EDRVNR, =-2). Der
Timeout wird vom System sinnvoll bestimmt.
1
Der Empfangspuffer wird gelöscht.
2
Der Sendepuffer wird gelöscht.
3
Empfangspuffer und Sendepuffer werden gelöscht.
-tout
Ein negativer Parameter funktioniert wie 0, aber tout (man
beachte, tout selbst ist positiv) gibt den Timeout in 1/200
Sekunden vor.
Stoppen des Empfangs
--------------------
#define TIOCSTOP (('T'<< 8) | 9)
Ist nur in den Handshakemodi verfügbar und teilt dem Kommunikationspartner
mit, daß der Rechner